﻿using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web.Mvc;
using lindyaka.Repository.Entities;
using lindyaka.Repository.Interfaces;

namespace lindyaka.Services.Administration
{
    public class UserAccountRoles
    {
        private readonly IRoleRepository _repositoryRoles;
        private readonly IUserAccountRoleRepository _repositoryUserAccountRoles;
        private readonly IUserAccountRepository _repositoryUserAccounts;

        public UserAccountRoles() : this(new UserAccountRole(), new UserAccount(), new Role())
        {
        }

        public UserAccountRoles(IUserAccountRoleRepository repositoryUserAccountRoles,
                                IUserAccountRepository repositoryUserAccounts, IRoleRepository repositoryRoles)
        {
            _repositoryUserAccountRoles = repositoryUserAccountRoles;
            _repositoryUserAccounts = repositoryUserAccounts;
            _repositoryRoles = repositoryRoles;
        }

        public Models.Administration.UserAccountRole Get(int userAccountId)
        {
            Domain.Entities.UserAccount userAccount = _repositoryUserAccounts.Find(u => u.UserAccountId == userAccountId);
            /* var dtmp = _repositoryUserAccountRoles.FindMany(
                userAccountRole => userAccountRole.UserAccountId == userAccountId); */
            var dtmp = _repositoryUserAccountRoles.FindAll().ToList<Domain.Entities.UserAccountRole>();
            var roleT = (from d in dtmp
                         join r in _repositoryRoles.FindAll()
                             on d.UserAccountRoleId equals r.RoleId
                         select new Models.Administration.UserAccountRoles
                             {
                                 UserAccountRoleId = d.UserAccountRoleId,
                                 RoleName = r.Name
                             });
            return new Models.Administration.UserAccountRole
                {
                    Email = userAccount.Email,
                    UserAccountId = userAccount.UserAccountId,
                    Roles = roleT
                };
        }


        public Models.Administration.UserAccountAssociateRoles GetWithRoles(int userAccountId)
        {
            Domain.Entities.UserAccount userAccount = _repositoryUserAccounts.Find(u => u.UserAccountId == userAccountId);
            return new Models.Administration.UserAccountAssociateRoles
            {
                Email = userAccount.Email,
                UserAccountId = userAccount.UserAccountId,
                Roles = (from r in _repositoryRoles.FindAll()
                            select new SelectListItem
                                {
                                    Value = r.RoleId.ToString(CultureInfo.InvariantCulture),
                                    Text = r.Name
                                }).ToList()
            };
        }

        public void Add(Models.Administration.UserAccountAssociateRoles userAccountAssociateRoles)
        {
            _repositoryUserAccountRoles.Add(new Domain.Entities.UserAccountRole
                {
                    RoleId = userAccountAssociateRoles.RoleId,
                    UserAccountId = userAccountAssociateRoles.UserAccountId
                });
        }

        public void Update(Models.Administration.UserAccount userAccount)
        {
            _repositoryUserAccounts.Update(new Domain.Entities.UserAccount
                {
                    Email = userAccount.Email,
                    LastLoggedIn = userAccount.LastLoggedIn,
                    Password = userAccount.Password,
                    Permission = userAccount.Permission,
                    Registered = userAccount.Registered,
                    Status = userAccount.Status,
                    UserAccountId = userAccount.UserAccountId
                });
        }

        public void Remove(Models.Administration.UserAccount userAccount)
        {
            _repositoryUserAccounts.Remove(u => u.UserAccountId == userAccount.UserAccountId);
        }
    }
}